$Description$
打字机上只有$28$个按键,分别印有$26$个小写英文字母和$’B’$、$’P’$两个字母。这个打字机是这样工作的:
输入小写字母,打字机的一个凹槽中会加入这个字母(这个字母加在凹槽的最后)。
按一下印有$’B’$的按键,打字机凹槽中最后一个字母会消失。
按一下印有$’P’$的按键,打字机会在纸上打印出凹槽中现有的所有字母并换行,但凹槽中的字母不会消失。 例如,阿狸输入$aPaPBbP$,纸上被打印的字符如下:$a aa ab$我们把纸上打印出来的字符串从$1$开始顺序编号,一直到$n$。打字机有一个非常有趣的功能,在打字机中暗藏一个带数字的小键盘,在小键盘上输入两个数$(x,y)($其中$1\leqslant x,y\leqslant n)$,打字机会显示第$x$个打印的字符串在第$y$个打印的字符串中出现了多少次。
$Solution:$
先无脑搭出一只$AC$自动机再说,然后再考虑各档分的做法
$40$
给每个串的结束位置都标记一下,给$AC$自动机中的每个节点记录一个父亲节点,然后对于每个串的结束位置都暴力往上跳,计算有几个被标记过的节点即可
$70(1)$
这样对于每一个询问都要暴力往上跳
如果对于某个串有重复的多次询问
那么就会多很多次没有任何意义的计算
所以,可以离线把所有询问都按照$y$排序
$y$相同的询问将从$y$向上跳碰到的标记记录下来,最后一起统计
$70(2)$
原来是$y$的某个节点往上跳能不能到达$x$
现在反过来:
$x$往下跳能够到达几个$y$的节点
如果把$y$这个字符串所有的节点全部打上一个$1$的标记
那么,每次就变成了求$x$结束位置的子树和
而一个点的子树在$dfs$序上一定是连续的一段
单点修改,区间查询,考虑用树状数组打标记
$100$
每次把串插入进树状数组会导致很多的串会有重复
考虑对$Trie$进行$dfs$
对于每个节点访问到的时候对它的$dfs$序打一个$+1$,结束的时候对它的$dfs$序打一个$-1$
每次访问到一个结束节点的时候,一定是有且仅有这个结束节点对应的串的所有节点被打了标记,这样就可以直接回答这个串作为$y$的所有询问了
$Code$
$40$
1 |
|
$70(1)$
1 |
|
$70(2)$
1 |
|
$100$
1 |
|